package utils

import (
	"crypto/rand"
	"fmt"
	"strings"
	"time"
)

// GenerateID 生成唯一ID
func GenerateID() string {
	bytes := make([]byte, 8)
	_, err := rand.Read(bytes)
	if err != nil {
		return ""
	}
	return fmt.Sprintf("%x", bytes)
}

// GenerateTaskID 生成任务ID
func GenerateTaskID(prefix string) string {
	timestamp := time.Now().Format("20060102150405")
	id := GenerateID()
	return fmt.Sprintf("%s-%s-%s", prefix, timestamp, id[:8])
}

// Contains 检查字符串切片是否包含指定元素
func Contains(slice []string, item string) bool {
	for _, s := range slice {
		if s == item {
			return true
		}
	}
	return false
}

// ContainsIgnoreCase 检查字符串切片是否包含指定元素（忽略大小写）
func ContainsIgnoreCase(slice []string, item string) bool {
	for _, s := range slice {
		if strings.EqualFold(s, item) {
			return true
		}
	}
	return false
}

// RemoveDuplicates 去除字符串切片中的重复元素
func RemoveDuplicates(slice []string) []string {
	keys := make(map[string]bool)
	var result []string

	for _, item := range slice {
		if !keys[item] {
			keys[item] = true
			result = append(result, item)
		}
	}

	return result
}

// SafeString 安全字符串，避免空指针
func SafeString(s *string) string {
	if s == nil {
		return ""
	}
	return *s
}

// ToPtr 将值转换为指针
func ToPtr[T any](v T) *T {
	return &v
}

// FromPtr 从指针获取值，如果为nil则返回零值
func FromPtr[T any](ptr *T) T {
	if ptr == nil {
		var zero T
		return zero
	}
	return *ptr
}
